/******************************************************************************* * Copyright (c) 2000, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Lars Vogel <Lars.Vogel@vogella.com> - Bug 472654 *******************************************************************************/ package org.eclipse.ui.internal.activities; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.ListenerList; import org.eclipse.ui.activities.IIdentifier; import org.eclipse.ui.activities.IIdentifierListener; import org.eclipse.ui.activities.IdentifierEvent; import org.eclipse.ui.internal.util.Util; final class Identifier implements IIdentifier { private final static int HASH_FACTOR = 89; private final static int HASH_INITIAL = Identifier.class.getName() .hashCode(); private final static Set<Identifier> strongReferences = new HashSet<>(); private Set<String> activityIds = Collections.emptySet(); private transient String[] activityIdsAsArray = {}; private boolean enabled; private transient int hashCode = HASH_INITIAL; private String id; private ListenerList<IIdentifierListener> identifierListeners; private transient String string; Identifier(String id) { if (id == null) { throw new NullPointerException(); } this.id = id; } @Override public void addIdentifierListener(IIdentifierListener identifierListener) { if (identifierListener == null) { throw new NullPointerException(); } if (identifierListeners == null) { identifierListeners = new ListenerList<>(ListenerList.IDENTITY); } identifierListeners.add(identifierListener); strongReferences.add(this); } @Override public int compareTo(Object object) { Identifier castedObject = (Identifier) object; int compareTo = Util.compare(activityIdsAsArray, castedObject.activityIdsAsArray); if (compareTo == 0) { compareTo = Util.compare(enabled, castedObject.enabled); if (compareTo == 0) { compareTo = Util.compare(id, castedObject.id); } } return compareTo; } @Override public boolean equals(Object object) { if (!(object instanceof Identifier)) { return false; } final Identifier castedObject = (Identifier) object; if (!Util.equals(activityIds, castedObject.activityIds)) { return false; } if (!Util.equals(enabled, castedObject.enabled)) { return false; } return Util.equals(id, castedObject.id); } void fireIdentifierChanged(IdentifierEvent identifierEvent) { if (identifierEvent == null) { throw new NullPointerException(); } if (identifierListeners != null) { for (IIdentifierListener listener : identifierListeners) { listener.identifierChanged(identifierEvent); } } } @Override public Set<String> getActivityIds() { return activityIds; } @Override public String getId() { return id; } @Override public int hashCode() { if (hashCode == HASH_INITIAL) { hashCode = hashCode * HASH_FACTOR + Util.hashCode(activityIds); hashCode = hashCode * HASH_FACTOR + Util.hashCode(enabled); hashCode = hashCode * HASH_FACTOR + Util.hashCode(id); if (hashCode == HASH_INITIAL) { hashCode++; } } return hashCode; } @Override public boolean isEnabled() { return enabled; } @Override public void removeIdentifierListener(IIdentifierListener identifierListener) { if (identifierListener == null) { throw new NullPointerException(); } if (identifierListeners != null) { identifierListeners.remove(identifierListener); if (identifierListeners.isEmpty()) { strongReferences.remove(this); } } } boolean setActivityIds(Set<String> activityIds) { activityIds = Util.safeCopy(activityIds, String.class); if (!Util.equals(activityIds, this.activityIds)) { this.activityIds = activityIds; this.activityIdsAsArray = this.activityIds.toArray(new String[this.activityIds.size()]); hashCode = HASH_INITIAL; string = null; return true; } return false; } boolean setEnabled(boolean enabled) { if (enabled != this.enabled) { this.enabled = enabled; hashCode = HASH_INITIAL; string = null; return true; } return false; } @Override public String toString() { if (string == null) { final StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append('['); stringBuffer.append(activityIds); stringBuffer.append(','); stringBuffer.append(enabled); stringBuffer.append(','); stringBuffer.append(id); stringBuffer.append(']'); string = stringBuffer.toString(); } return string; } }